package com.atguigu.mybatisplus.handler;

import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;

import java.time.LocalDateTime;

/**
 * 我们希望应用程序运行时，这个类自动的被加载到Spring容器上下文当中，
 * 添加这个注解，这个类的对象就会被SpringBoot自动管理，我们就不用主动地去new
 * 同时，应用程序一启动，Spring就创建，初始化，加载它
 * 程序运行时会检查是否添加fill属性，如果有就来到MyMetaObjectHandler自动调用
 */
@Component
@Slf4j  //用于打印日志
public class MyMetaObjectHandler implements MetaObjectHandler {


    @Override
    public void insertFill(MetaObject metaObject) {

        log.info("insert 自动填充。。。。。。");
        //实现填充业务逻辑
        this.strictInsertFill(metaObject,"createTime", LocalDateTime.class,LocalDateTime.now());
        this.strictInsertFill(metaObject,"updateTime", LocalDateTime.class,LocalDateTime.now());

        //优化一 判断是否有属性需要自动填充
        boolean hasAuthor = metaObject.hasSetter("author");
        if (hasAuthor){
            log.info("insert author 属性");
            this.strictInsertFill(metaObject,"author",String.class,"石头");
        }

        //优化二 判断当前对象的自动填充属性是否已经进行了赋值
        Object age = this.getFieldValByName("age", metaObject);
        if (age == null){
            log.info("insert age 属性");
            this.strictInsertFill(metaObject,"age",Integer.class,3);
        }

    }

    @Override
    public void updateFill(MetaObject metaObject) {

        log.info("update 自动填充。。。。。。");
        this.strictUpdateFill(metaObject,"updateTime", LocalDateTime.class,LocalDateTime.now());
        //这里strictUpdateFill与strictInsertFill都可以

    }
}
